import json
from django.http import JsonResponse
from book.models import BookInfo
from .serializer import BookSerializer
from django.shortcuts import render
# 视图基类1
from rest_framework.views import APIView
from rest_framework.views import Response
# Create your views here.
# from django.views import View


class Books(APIView):
    """
    REST framework 提供的视图基类APIView 继承 Django的 View
    不同之处(封装了肯定就更加简便一些)：
    1.传入视图方法中的是REST framework 提供的 Request 对象，不是以前的Django的HttpRequest
    2.视图方法可以返回REST framework的Response对象，视图会为响应数据设置（render）符合前端要求的格式；
    3.任何APIException异常都会被捕获到，并且处理成合适的响应信息；
    4.在进行dispatch()分发前，会对请求进行身份认证、权限检查、流量控制。
    """
    def get(self, request):
        # 1、查询所有图书对象
        books = BookInfo.objects.all()

        ser= BookSerializer(books,many=True)

        # return JsonResponse(ser.data, safe=False)
        # REST framework 封装后的Response
        return Response(ser.data)

    def post(self, request):
        # 1、获取前端数据
        # data = request.body.decode()
        # data_dict = json.loads(data)
        # 使用REST framework 的Request , 封装了解析的功能
        data = request.data
        # 2、验证数据
        ser= BookSerializer(data=data)
        ser.is_valid()  # 验证方法

        # 3、保存数据
        # print(ser.data)
        ser.save()
        # 4、返回结果
        # return JsonResponse(ser.data)
        return Response(ser.data)


class BookDRFView(APIView):
    """
        获取单一和更新和删除
    """

    def put(self, request, pk):
        # 1、获取前端数据
        # data = request.body.decode()
        # data_dict = json.loads(data)
        data = request.data
        print('come in')
        # 2、验证数据
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '错误信息'}, status=400)
        ser=BookSerializer(book,data=data)
        ser.is_valid()
        # 3、更新数据
        ser.save()
        # 4、返回结果
        # return JsonResponse(ser.errors)
        return Response(ser.data)

    def delete(self, request, pk):
        # 1、查询数据对象
        try:
            book = BookInfo.objects.get(id=pk)

        except:
            return JsonResponse({'error': '错误信息'}, status=400)

        book.is_delete=True
        book.save()
        return JsonResponse({})
